package edu.uoc.tds.cliente;



import edu.uoc.tds.bean.*;
import edu.uoc.tds.common.*;
import java.util.*;
import javax.swing.*;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.rmi.RemoteException;
import java.awt.event.*;
import java.awt.Color;
import java.util.ArrayList;
import edu.uoc.tds.common.UtilLenguaje;
import edu.uoc.tds.server.GestorDisco;
import edu.uoc.tds.server.GestorInscripcion;
import javax.swing.JOptionPane;



/*******************************************************************************
* Propósito: Pantalla del subsistema de Conexión que permite ver los eventos
* a los que se ha inscriito un usuario, además de permitirle hacer el
* chek-in de los eventos a los que ha asistido.
*
* @author Fco. Javier González
* @version 1.0
*******************************************************************************/
public class PantallaInscripcionHistorico extends javax.swing.JPanel implements
ActionListener
{


    private JLabel labelA;
    private JComboBox comboTipoEvento;
    private JLabel labelFd;
    private JLabel labelFh;
    private JLabel labelTipo;
    private JFormattedTextField textoFechaD;
    private JFormattedTextField textoFechaH;
    private JButton botonBuscar;
    private JButton botonCheckin;
    private JButton botonSalir;
    private JButton botonLimpiar;
    private final DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    private RemotoInterface objeto;
    private JTable tabla;
    private MiTableModel modelo;
    private JScrollPane scroll;
    private JLabel labelTitulo;
    private ArrayList<String> listaIdEvento;
    private int idEvento;

    private String userId = Variables.usuarioConectado.getCodigo();


   /***************************************************************************
   *
   * Constructor
   *
   ***************************************************************************/
    public PantallaInscripcionHistorico(RemotoInterface objeto)
    {
         //El objeto remoto se pasa como parámetro en el constructor
        this.objeto= objeto;


        initComponents();
        setNonbreUsuario();

        //Estableceremos la posicion de los componentes manualmente
        this.setLayout(null);        
    }



    /***************************************************************************
    *
    * Inicializa los controles
    *
    ***************************************************************************/
    private void initComponents()
    {


        //Título de la pantalla
        labelTitulo = new JLabel();
        labelTitulo.setBounds(180, 5, 420, 35);
        labelTitulo.setForeground(Color.blue);
        labelTitulo.setFont(new java.awt.Font("Tahoma", 1, 14));
        labelTitulo.setText(UtilLenguaje.getMessage("PantallaInsHistorico.titulo"));
       
        //Label de asistentes
        labelA = new JLabel();        
        labelA.setBounds(40, 55, 250, 25);

        //Label fecha desde
        labelFd = new JLabel();
        labelFd.setText(UtilLenguaje.getMessage("PantallaInsHistorico.fd"));
        labelFd.setBounds(40, 85, 130, 25);

        //Campo de texto Fecha desde
        textoFechaD = new JFormattedTextField(sdf);
        textoFechaD.setBounds(120, 85, 130, 25);

        //Label fecha hasta
        labelFh = new JLabel();
        labelFh.setText(UtilLenguaje.getMessage("PantallaInsHistorico.fh"));
        labelFh.setBounds(265, 85, 130, 25);

        //Campo de texto Fecha hasta
        textoFechaH = new JFormattedTextField(sdf);
        textoFechaH.setBounds(340, 85, 130, 25);

        //Label de eventos
        labelTipo = new JLabel();
        labelTipo.setText(UtilLenguaje.getMessage("PantallaInsHistorico.tipo"));
        labelTipo.setBounds(480, 85, 130, 25);
        
        //Botón de buscar
        botonBuscar = new JButton();
        botonBuscar.setText(UtilLenguaje.getMessage("PantallaInsHistorico.buscar"));
        botonBuscar.addActionListener(this);
        botonBuscar.setBounds(40, 480, 130, 25);

        //Botón para salir
        botonSalir = new JButton();
        botonSalir.setText(UtilLenguaje.getMessage("PantallaInsHistorico.salir"));
        botonSalir.addActionListener(this);
        botonSalir.setBounds(603, 480, 130, 25);

        //Botón para limpiar los resultados
        botonLimpiar = new JButton();
        botonLimpiar.setText(UtilLenguaje.getMessage("PantallaInsHistorico.limpiar"));
        botonLimpiar.addActionListener(this);
        botonLimpiar.setBounds(220, 480, 150, 25);
        botonLimpiar.setEnabled(false);

        //Botón de checkin
        botonCheckin = new JButton();
        botonCheckin.setText(UtilLenguaje.getMessage("PantallaInsHistorico.checkin"));
        botonCheckin.addActionListener(this);
        botonCheckin.setBounds(420, 480, 130, 25);
        botonCheckin.setEnabled(false);


        //Tabla
        modelo = new MiTableModel();
        tabla = new JTable(modelo);

        //JScrollPane que contiene la tabla y muestra columnas
        scroll = new JScrollPane(tabla);
        scroll.setBounds(40, 130, 693, 320);
        this.add(scroll);

        //Nombres de columna
        Object [] nombres = {UtilLenguaje.getMessage("PantallaInsHistorico.co1"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co2"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co3"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co4"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co5"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co6"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co7"),
        UtilLenguaje.getMessage("PantallaInsHistorico.co8") };
        modelo.setColumnIdentifiers(nombres);

        //Añadimos los componentes al panel
        this.add(textoFechaD);
        this.add(textoFechaH);
        this.add(labelA);
        this.add(labelFd);
        this.add(labelFh);
        this.add(labelTipo);
        this.add(getComboTipoEvento());
        this.add(botonBuscar);
        this.add(botonLimpiar);
        this.add(botonSalir);
        this.add(scroll);
        this.add(labelTitulo);
        this.add(botonCheckin);

    }


    /***************************************************************************
    *
    * Acciones que se llevan a cabo al pulsar los botones
    *
    ***************************************************************************/
    public void actionPerformed(ActionEvent e)
    {

        Object origen = e.getSource();

        //Si se pulsa el botón iniciar
        if(origen == botonBuscar &&  controlFecha())
        {

            listaIdEvento = new ArrayList<String>();

            /*Se rellena la tabla y se guarda la lista de los id de eventos*/
            listaIdEvento = rellenarTabla();

   
            //Acciones que se llevan a cabo al hacer click con el ratón
            tabla.addMouseListener(new MouseAdapter()
            {
                public void mouseClicked(MouseEvent e)
                {

                    if(e.getClickCount()==1)
                    {

                        int fila = tabla.rowAtPoint(e.getPoint());

                        //Obtenemos el id de evento que corresponde con la fila de la tabla que se selecciona
                        String cadena = listaIdEvento.get(fila);
                        idEvento = Integer.parseInt(cadena);

                        cadena = (modelo.getValueAt(fila, 7)).toString();
                        String estado = (modelo.getValueAt(fila, 6)).toString();

                        //Estado en curso (entre la fecha de inicio y finaclizaciÃ³n) y asisntecia sin confirmar
                        if (cadena.equalsIgnoreCase("Sin confirmar")== true
                                && estado.equalsIgnoreCase("En curso")== true)
                        {
                             botonCheckin.setEnabled(true);
                        }
                        else botonCheckin.setEnabled(false);

                      }

                   }
               }
           );

        }

        else if(origen == botonSalir)
        {

            this.removeAll();
            this.updateUI();

        }

        else if(origen == botonLimpiar)
        {
            limpiar();            
        }

        else if(origen == botonCheckin)
        {

            try
            {

                objeto.setCheckin(userId, idEvento);

                //Inserción correcta
                JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage("PantallaInsHistorico.chekok"),
                UtilLenguaje.getMessage("PantallaInsHistorico")
                , JOptionPane.INFORMATION_MESSAGE);
            }
            
            catch(RemoteException er)
            {
                
                JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage("PantallaInscripcion.err.remoto"),
                UtilLenguaje.getMessage("PantallaInsHistorico")
                , JOptionPane.ERROR_MESSAGE);
            }

            catch (Exception er)
            {
                
                JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage("PantallaInscripcion.err.in"),
                UtilLenguaje.getMessage("PantallaInsHistorico")
                , JOptionPane.ERROR_MESSAGE);
            }

            finally
            {
                limpiar();



            }

        }
    }

    
    /***************************************************************************
    *
    *  Limia la tabla y pone las condiciones iniciales     
    *
    ***************************************************************************/
    private void limpiar()
    {
        //Eliminar las filas existentes
        int c = modelo.getRowCount();

        for (int i=c-1; i>=0; i--)
        {
             modelo.removeRow(i);
             tabla.revalidate();
        }

        resetearFechas();
        botonLimpiar.setEnabled(false);
        botonCheckin.setEnabled(false);
        
    }

    /***************************************************************************
    *
    *  Gestión de la tabla
    *
    * return ArrayList<String> ArrayList de Strings con los id de los eventos que
    * aparecen en la tabla
    *
    ***************************************************************************/
    private ArrayList<String> rellenarTabla()
    {

          ArrayList<Object[]> lista = new ArrayList<Object[]>();
          ArrayList<String> listaId = new ArrayList<String>();

         try
         {

                //Sacamos lo seleccionado en el comnbo de eventos
                String tipoEvento = comboTipoEvento.getSelectedItem().toString();

                //Fecha desde
                java.util.Date utilDateD = new java.util.Date();
                utilDateD = sdf.parse(textoFechaD.getText());

                //Fecha hasta
                java.util.Date utilDateH = new java.util.Date();
                utilDateH = sdf.parse(textoFechaH.getText());

                //Fecha actual
                java.util.Date utilDateA = new java.util.Date();
                utilDateA = sdf.parse(getFecha());

                lista = objeto.getHistoricoIns(userId,utilDateD, utilDateH,utilDateA,tipoEvento);

                //Eliminar las filas existentes
                int c = modelo.getRowCount();

                for (int i=c-1; i>=0; i--)
                {
                    modelo.removeRow(i);
                    tabla.revalidate();
                }

                Object [] dat = null;
                for (int i=0; i< lista.size(); i++)
                {
                    dat = new String[8];
                    int valor = 0;

                    for (int j=0; j<10; j++)
                    {

                        if(j!= 7 && j!= 8 && j!=9 && j!=0)
                        {
                            dat[j-1] = lista.get(i)[j].toString();
                        }
                        
                        
                        //Los id de los eventos se guardan en listaId y no se muestran en la lista maestro
                        if(j==0)
                        {

                            String id = lista.get(i)[j].toString();
                            listaId.add(id);
                        }                        

                        if (j == 7)
                        {
                            //Fecha inicio - fecha actual
                            if (Integer.parseInt(lista.get(i)[j].toString()) < 0) valor = 1;
                        }
                        if (j == 8)
                        {
                            //Fecha inicio + dureacion -1 - fecha actual
                            if (Integer.parseInt(lista.get(i)[j].toString()) < 0) valor = valor + 1;

                            switch(valor)
                            {
                                case 0:
                                      dat[j-2]= UtilLenguaje.getMessage("PantallaInsHistorico.programado");
                                      break;
                                case 1:
                                      dat[j-2]= UtilLenguaje.getMessage("PantallaInsHistorico.celebrandose");
                                      break;
                                case 2:
                                      dat[j-2]= UtilLenguaje.getMessage("PantallaInsHistorico.finalizado");
                                      break;
                            }

                        }
                        if (j==9)
                        {
                            if(lista.get(i)[j].toString().equalsIgnoreCase("True")) dat[j-2] = UtilLenguaje.getMessage("PantallaInsHistorico.asistido");

                            else dat[j-2] = UtilLenguaje.getMessage("PantallaInsHistorico.sinConfirmar");

                        }


                   }

                  modelo.addRow(dat);

                }

                tabla.updateUI();
                this.updateUI();
                botonLimpiar.setEnabled(true);
            }

            catch(RemoteException er)
            {
                
                JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage("PantallaInscripcion.err.remoto"),
                UtilLenguaje.getMessage("PantallaInsHistorico")
                , JOptionPane.ERROR_MESSAGE);
            }

            catch (Exception er)
            {

                JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage("PantallaInscripcion.err.in"),
                UtilLenguaje.getMessage("PantallaInsHistorico")
                , JOptionPane.ERROR_MESSAGE);
            }

          finally
            {
                return listaId;

            }

    }




    /**************************************************************************
    *
    * Crea un combo relleno con los tipos de eventos
    *
    * @return  JComboBox
    *
    ***************************************************************************/
    private JComboBox getComboTipoEvento()
    {

        if (comboTipoEvento == null)
        {


            Vector<MostrarCombo> vTipoEventos;

            try
            {

                vTipoEventos = this.objeto.listaTipoEventos();
                comboTipoEvento = new JComboBox(vTipoEventos);
                comboTipoEvento.addItem("Todos los eventos");
                comboTipoEvento.setSelectedIndex(4);
                comboTipoEvento.setBounds(580, 85, 150, 25);
            }

            catch (RemoteException eRe)
            {
                JOptionPane.showMessageDialog(null,UtilLenguaje.
                        getMessage("PantallaInscripcion.err.remoto") + "\n" + eRe.getMessage(),
                        UtilLenguaje.getMessage("PantallaInscripcion"), JOptionPane.ERROR_MESSAGE);

            }

        }

        return comboTipoEvento;
    }



    /****************************************************************************
    *
    * Verifica que las fechas introducidas son correctas
    *
    * @return boolean Verdadero si son correctas
    *
    ****************************************************************************/
    private boolean controlFecha()
    {

        boolean control = false;
        try
        {
            //Fecha 
            java.util.Date utilDateFechaH = new java.util.Date();
            java.util.Date utilDateFechaD = new java.util.Date();

            //El número de caracteres máximo en la fecha es 10 (dd/mm/yyyy)
            if (textoFechaH.getText().length()> 10 || textoFechaD.getText().length()> 10)
            {
                throw new Exception();

            }

            utilDateFechaH = sdf.parse(textoFechaH.getText());
            utilDateFechaD = sdf.parse(textoFechaD.getText());

            //Si la fecha desde es inferior a la fecha hasta +1
            if(utilDateFechaH.compareTo(utilDateFechaD) < 0)
            {
                  throw new Exception();


            }

            control= true;
        }

        //Fecha incorrecta
        catch (ParseException ex)
        {
            JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage
            ("PantallaInsHistorico.Error.Fecha"),UtilLenguaje.getMessage("PantallaInsHistorico")
            , JOptionPane.ERROR_MESSAGE);

            //Reseteamos la fecha
            resetearFechas();
        }
        
        //Otro error 
        catch (Exception ef)
        {
            JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage
            ("PantallaInsHistorico.Error.Fecha"), UtilLenguaje.getMessage("PantallaInsHistorico")
            , JOptionPane.ERROR_MESSAGE);

            //Reseteamos la fecha
            resetearFechas();

        }

        finally
        {
            return control;
        }

    }


    /***************************************************************************
    *
    * Resetea las fechas
    *
    ***************************************************************************/
    private void resetearFechas()
    {
         try
         {
            textoFechaH.setValue(null);
            textoFechaD.setValue(null);
            textoFechaD.commitEdit();
            textoFechaH.commitEdit();
         }

         catch (ParseException ex)
         {
             //Si se cambia a null, siempre entrará aquí
         }

    }

    
    /***************************************************************************
    *
    * Devuelve la fecha actual
    *
    * @return String La fecha actual
    *
    ***************************************************************************/
    private String getFecha()
    {

        Calendar cal = new GregorianCalendar();

        String cadenaFecha  = (Integer.toString(cal.get(Calendar.DAY_OF_MONTH))) +
        "/" + (Integer.toString(cal.get(Calendar.MONTH ) + 1)) + "/" +
        (Integer.toString(cal.get(Calendar.YEAR)));

        return(cadenaFecha);
    }

    /***************************************************************************
    *
    * Establece el nombre y apellidos del usuario
    *
    *
    ***************************************************************************/
    public void setNonbreUsuario()
    {        
    
        try
        {

            //Obtenemos los datos de la BBDD y los almacenamos en lista
            ArrayList<Object[]> lista = new ArrayList<Object[]>();

            lista =  objeto.getDatosIns(userId, false);
            String nombre="";

            //Obtenemos cada campo y los concatenamos en una cadena
            for (int i=0; i< lista.size(); i++)
            {
                for (int j=0; j<2; j++)
                {
                    switch(j)
                    {

                        case 0:
                              nombre = lista.get(i)[j].toString();
                              break;
                        case 1:
                              nombre = nombre + " " + lista.get(i)[j].toString();
                              break;
                      
                     }

                }

            }

            //Label asistente
            labelA.setText((UtilLenguaje.getMessage("PantallaInsHistorico.asis") + "    " + nombre));


        }

        catch(RemoteException er)
        {

            JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage("PantallaInscripcion.err.remoto"),
            UtilLenguaje.getMessage("PantallaInsHistorico")
            , JOptionPane.ERROR_MESSAGE);

        }

        catch (Exception er)
        {

            JOptionPane.showMessageDialog(null, UtilLenguaje.getMessage
            ("PantallaInscripcion.err.in"),UtilLenguaje.getMessage("PantallaInsHistorico")
            , JOptionPane.ERROR_MESSAGE);

        }

    }
}

